/*
 * @Author: Lieven Vandeperre
 * @Description: Data Access object voor Luchthaven
 */
package core.logic.dataAccess;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import core.logic.services.utilServices.ConnectionService;
import core.models.dataModels.ZoekLuchthavenModel;
import core.models.domainModel.Adres;
import core.models.domainModel.Luchthaven;

public class LuchthavenDAO {

	//deze methode gaat enkel op zoek naar de basisobjecten en vervolledigt zijn innerlijke entiteiten niet (in dit geval wordt adres niet opgehaald
	public static ArrayList<Luchthaven> getAllBasic(){
		String sql = "SELECT * FROM Luchthaven";
		ArrayList<Luchthaven> lijst = new ArrayList<>();
		try{
			Statement statement = ConnectionService.getConnection().createStatement();
			ResultSet rs = statement.executeQuery(sql);
		
			while(rs.next()){
				Luchthaven LH = new Luchthaven(rs.getInt("LuchthavenId"), rs.getString("LuchthavenCode"), rs.getString("LuchthavenNaam"), null);
				lijst.add(LH);
			}
		
		}
		catch(SQLException ex){
			
		}
		return lijst;
	}
	
	public static ArrayList<Luchthaven> getAllLuchthavens()
	{
		String sqlString = "SELECT Luchthaven.LuchthavenId, "
							+ "Luchthaven.LuchthavenCode, "
							+"Luchthaven.LuchthavenNaam, "
							+"Adres.Straat, "
							+"Adres.Huisnumer, "
							+"Adres.bus, "
							+"Adres.PostCode, "
							+"Adres.Gemeente, "
							+"Adres.Staat_Provincie, "
							+"Adres.Land "
						+"FROM Luchthaven "
						+"INNER JOIN Adres "
						+"ON Adres.AdresId = Luchthaven.AdresId";
		ArrayList<Luchthaven> lijst = new ArrayList<Luchthaven>();
		try
		{
			Statement statement = ConnectionService.getConnection().createStatement();
			ResultSet rs = statement.executeQuery(sqlString);
		
			while(rs.next())
			{
				Adres ditadres = new Adres(rs.getString("Straat"), 
						 rs.getInt("Huisnumer"),
						 rs.getString("bus"),
						 rs.getString("Gemeente"), 
						 rs.getString("PostCode"), 
						 rs.getString("Staat_Provincie"), 
						rs.getString( "Land"));
				//public Luchthaven(int id, String luchthavenCode, String luchthavenNaam, Adres adres)
				
				Luchthaven LH = new Luchthaven(rs.getInt("LuchthavenId"), 
												rs.getString("LuchthavenCode"), 
												rs.getString("LuchthavenNaam"), 
												ditadres);
				lijst.add(LH);
			}
		}
		catch(SQLException ex)
		{
			JOptionPane.showMessageDialog(null,"oeioei! error!","TITLE",JOptionPane.WARNING_MESSAGE);
			ex.printStackTrace();
		}
		return lijst;
	}
	
	
	// @Author: Wijnen David [c1026300]
	// --------------------------------
	// @Description: Toevoegen van een luchthaven
	public static int addLuchthaven(String luchthavenCode, String luchthavenNaam, int adresId)
	{
		int result = 0;
		String sqlString = "INSERT INTO Luchthaven(AdresId, LuchthavenCode, LuchthavenNaam) VALUES (?, ?, ?)";
		// ter info VALUES(int, varchar(3), varchar(150));
		
		try{
			// connectie maken
			Connection con = ConnectionService.getConnection();
			PreparedStatement pst = con.prepareStatement(sqlString);
			
			// parameters meegeven
			pst.setInt(1, adresId);					//int
			pst.setString(2, luchthavenCode);		//varchar(3)
			pst.setString(3, luchthavenNaam);		//varchar(150)
			
			// opdracht uitvoeren
			result = pst.executeUpdate();
		}
		catch(SQLException ex){
			JOptionPane.showMessageDialog(null, ex.getMessage());
			ex.printStackTrace();
		}
		
		// return of het gelukt is of niet
		return result;
	}
	
	public static Luchthaven getLuchthavenByLuchthavenId(int luchthavenId) {
		Luchthaven luchthaven = null;
		Adres adres = null;
		String sql = "SELECT LuchthavenCode, LuchthavenNaam, AdresId "
				+    "FROM Luchthaven "
				+    "WHERE LuchthavenId = ?";
		
		try {
			PreparedStatement statement = ConnectionService.getConnection().prepareStatement(sql);
			statement.setInt(1, luchthavenId);
			
			ResultSet resultSet = statement.executeQuery();
			
			if (resultSet.next()) {
				adres = new Adres("", 0, "", "", "");
				adres.set_adresId(resultSet.getInt("AdresId"));
				
				luchthaven = new Luchthaven(
						luchthavenId,
						resultSet.getString("LuchthavenCode"),
						resultSet.getString("LuchthavenNaam"),
						adres);
			}
		} catch (SQLException ex) {
			ex.printStackTrace();
		}
		
		return luchthaven;
	}
	
	public static boolean updateLuchthaven(int luchthavenId, String luchthavenCode, String luchthavenNaam) {
		String sql = "UPDATE Luchthaven "
				+    "SET LuchthavenCode = ?, "
				+        "LuchthavenNaam = ? "
				+    "WHERE LuchthavenId = ?";
		int result = 0;
		
		try {
			PreparedStatement statement = ConnectionService.getConnection().prepareStatement(sql);
			statement.setString(1, luchthavenCode);
			statement.setString(2, luchthavenNaam);
			statement.setInt(3, luchthavenId);
			
			result = statement.executeUpdate();
		} catch(SQLException ex) {
			ex.printStackTrace();
		}
		
		return (result == 1);
	}

	//@Author: Leen Van Pelt
	public static ArrayList<Luchthaven> getLuchthavenByModel(ZoekLuchthavenModel ditmodel)
	{
		//gebaseerd op PersoneelDAO (zelfde systeemke)
		ArrayList<Luchthaven> resultaten = new ArrayList<Luchthaven>();
		
		//OPBOUWEN SQL-COMMANDO
		String sql = "SELECT * FROM Luchthaven,Adres WHERE Adres.AdresId = Luchthaven.AdresId";
		if (!ditmodel.getZoekwaardecodeLuchthaven().isEmpty())
		{
			sql = sql + " AND ";
			sql = sql + "Luchthaven.Luchthavencode = ?";
		}
		if (!ditmodel.getZoekwaardeGemeente().isEmpty())
		{
			sql = sql + " AND ";
			sql = sql + "Adres.Gemeente = ?";
		}
		if (!ditmodel.getZoekwaardeLand().isEmpty())
		{
			sql = sql + " AND ";
			sql = sql + "Adres.Land = ?";
		}
		if (!ditmodel.getZoekwaardeNaamLuchthaven().isEmpty())
		{
			sql = sql + " AND ";
			sql = sql + "Luchthaven.LuchthavenNaam = ?";
		}
		
		try 
		{
			int i = 1;
			PreparedStatement pst= ConnectionService.getConnection().prepareStatement(sql);
			
			//OPBOUWEN PARAMETERS
			if (!ditmodel.getZoekwaardecodeLuchthaven().isEmpty())
			{
				pst.setString(i, ditmodel.getZoekwaardecodeLuchthaven());
				i++;
			}
			if (!ditmodel.getZoekwaardeGemeente().isEmpty())
			{
				pst.setString(i, ditmodel.getZoekwaardeGemeente());
				i++;
			}
			if (!ditmodel.getZoekwaardeLand().isEmpty())
			{
				pst.setString(i, ditmodel.getZoekwaardeLand());
				i++;
			}
			if (!ditmodel.getZoekwaardeNaamLuchthaven().isEmpty())
			{
				pst.setString(i, ditmodel.getZoekwaardeNaamLuchthaven());
				i++;
			}
			
			ResultSet rs = pst.executeQuery();
			while(rs.next())
			{
				Adres ditadres = new Adres(rs.getString("Straat"), 
						 rs.getInt("Huisnumer"),
						 rs.getString("bus"),
						 rs.getString("Gemeente"), 
						 rs.getString("PostCode"), 
						 rs.getString("Staat_Provincie"), 
						rs.getString( "Land"));
				
				Luchthaven LH = new Luchthaven(rs.getInt("LuchthavenId"), 
												rs.getString("LuchthavenCode"), 
												rs.getString("LuchthavenNaam"), 
												ditadres);
				resultaten.add(LH);
				
			}
				
		} catch (Exception e) 
		{
			JOptionPane.showMessageDialog(null,"oeioei! error in de LuchthavenDAO.getLuchthavenByModel", "Error!",JOptionPane.WARNING_MESSAGE);
		}
				
		return resultaten;
	}
}
